====== Server umziehen =======

  * Monit auf beiden Servern deaktivieren
  * SoSci-Cache leeren
  * Server sperren
  * Datenbank exportieren
  * Dateien kopieren
  * Datenbank importieren
  * Datenbank-Zugangsdaten in SoSci Survey setzen
  * Bei www.soscisurvey.de die ''sites-available'' ergänzen (Homepage, Anleitung, Owncloud)
  * IP-Adresse ändern
    * Primäradresse auf dem alten System entfernen
    * Primäradresse auf dem neuen System setzen (alte vorerst als Sekundäradresse behalten)
    * Wenn alles läuft: Sekundäradresse tauschen
  * Transfer-Dateien (SQL) löschen


===== User für Datei-Umzug =====

Wenn der keyfile-Login aktiv bleiben soll, bietet es sich an, einen neuen Nutzer auf dem alten Server anzulegen.

Dafür brauchen wir erstmal ein neues Schlüsselpaar auf dem neuen Server

<code bash>
ssh-keygen -t rsa -b 4096 -C "transfer"
cat ~/.ssh/id_rsa.pub
</code>

Dann den neuen Nutzer auf dem alten Server.

<code bash>
sudo su
adduser transfer --gecos ""
# Passwort eingeben oder auch nicht
cd /home/transfer
mkdir .ssh && chown transfer .ssh && chmod 700 .ssh
vim .ssh/authorized_keys
# Inhalte aus transfer.pub vom anderen Server rüberkopieren
chown transfer .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
# Der transfer-User braucht die root- und www-Zugehörigkeit zum Kopieren der HTML-Verzeichnisse
usermod -a -G root transfer
usermod -a -G www-ftp transfer
usermod -a -G www-data transfer
usermod -a -G adm transfer
</code>

**Falls es mal nicht klappt:** Den Test-Port 3321 in der ''rules.base'' freigeben.

<code>
-4 -A INPUT -s 95.130.22.103 -p tcp --dport 3321 -j ACCEPT
# Dann den Test-SSH starten
sudo /usr/sbin/sshd -d -p 3321
# Zugriff auf den Test-Port
ssh transfer@95.130.22.100 -p 3321 -i ~/.ssh/id_rsa
# Eventuell braucht der transfer-User auch zeitweise die Root-Zugehörigkeit
sudo usermod -a -G root transfer
sudo gpasswd -d transfer root
</code>

Zuletzt noch den Zugriff testen.

<code bash>
ssh transfer@95.130.22.100 -i ~/.ssh/id_rsa
</code>

Und dann natürlich Dateien kopieren - über ''/home/transfer/''.

<code bash>
scp  -i ~/.ssh/id_rsa transfer@95.130.22.100:/home/transfer/contents/* /etc/nginx/sites-available/
</code>


Beginnen wir einmal mit der ''nginx'' und ''postfix'' Konfiguration. Der Rest geht dann besser mit ''rsync''.

<code bash>
scp  -i ~/.ssh/id_rsa -r /etc/nginx/conf.d/* transfer@95.130.22.103:/home/transfer/nginx

###

mv /home/transfer/nginx/* /etc/nginx/conf.d
chown root:root /etc/nginx/conf.d/*

mv /etc/postfix/main.cf /etc/postfix/main.dist
sftp -i ~/.ssh/id_rsa transfer@95.130.22.100 << EOF
  get /etc/postfix/main.cf /etc/postfix/main.cf
  get /etc/postfix/senders /etc/postfix/senders
  get /etc/postfix/virtual /etc/postfix/virtual
EOF

postmap /etc/postfix/senders
postmap /etc/postfix/virtual
</code>

===== Inhalte kopieren =====

Grober Ablauf

  * Dateien synchronisieren
  * Monit stoppen
  * Server sperren
  * Datenbank in Datei schreiben (Dump)
  * Dateien nochmal synchronisieren
  * Datenbank einspielen
  * IP-Adressen umstellen
  * Server entsperren
  * Monit starten

Aber jetzt zu den Dateien. Was brauchen wir?

  * Dateien ''/root/backup/*.sh''
  * Dateien unter ''/var/www/''
    * SoSci Survey
    * SSL-Zertifikate (sofern vorhanden)
  * ''/root/.duply/files/exclude'' kopieren bzw. ergänzen
  * Let's Encrypt Konfiguration

<code bash>
# Vorab: Arbeits-Cache löschen, Schreibcache auflösen (auf dem alten Server)
sudo chmod -R 750 /var/www/s2survey/html/files/protected
sudo chmod -R 750 /var/www/s2survey/html/system/keyring

# Dann die Dateien kopieren (Befehle werden auf dem neuen Server aufgerufen)
sudo rsync -av -e ssh --delete --exclude=/system/session/ --exclude=/system/cache/ --exclude=/view transfer@95.130.22.100:/var/www/s2survey/html/ /var/www/s2survey/html/
sudo rsync -av -e ssh --delete transfer@95.130.22.100:/var/www/s2survey/log/ /var/www/s2survey/log/
sudo rsync -av -e ssh --delete transfer@95.130.22.100:/var/www/shibboleth /var/www/
</code>

Die Zugriffsrechte müssen noch repariert werden.

Erstmal ist es gut zu wissen, mit welchen Rechten ''nginx'' läuft: ''sudo ps aux| grep nginx''

Das mit den Rechten ist ein wenig komplizierter.

^Verzeichnis^nginx^php^FTP^user:group^Rechte^
|''/html/''|lesen|schreiben|schreiben|www-ftp:www-data|775|
|''/html/admin/''|lesen|lesen|schreiben|www-ftp:www-data|755|
|''/html/images''|lesen|lesen|schreiben| 
|''/html/inc''|lesen|lesen|schreiben|
|''/html/layout''|lesen|lesen|schreiben| 
|''/html/lib''|lesen|lesen|schreiben|
|''/html/modules''|lesen|lesen|schreiben| 
|''/html/plugins''|lesen|lesen|schreiben|
|''/html/script''|lesen|lesen|schreiben|
|''/html/system''|lesen|schreiben|schreiben|
|''/html/files''|-|schreiben|-|
|''/html/view''|lesen|schreiben|lesen|

<code bash>
# Die Projektverzeichnisse müssen www-data gehören, damit PHP dort schreiben kann
# Und es muss auch die www-data Gruppe sein, weil nginx auf den neuen Maschinen nicht mehr www-data ist.
sudo chown -R www-data:www-data /var/www/s2survey/html

# Einige Verzeichnisse sind exklusiv www-data zugeordnet
sudo chown -R www-data:www-data /var/www/s2survey/html/system/keyring
sudo chown -R www-data:www-data /var/www/s2survey/html/shop/system/keyring
sudo chown -R www-data:www-data /var/www/s2survey/html/files
sudo chown -R www-data:www-data /var/www/s2survey/html/system

# FTP ist der Besitzer der Bibliotheken, aber die ganze www-data Gruppe (inkl. nginx) hat Lesezugriff
sudo chown -R www-ftp:www-data /var/www/s2survey/html/admin
sudo chown -R www-ftp:www-data /var/www/s2survey/html/inc
sudo chown -R www-ftp:www-data /var/www/s2survey/html/lib
sudo chown -R www-ftp:www-data /var/www/s2survey/html/images
sudo chown -R www-ftp:www-data /var/www/s2survey/html/internal
sudo chown -R www-ftp:www-data /var/www/s2survey/html/layout
sudo chown -R www-ftp:www-data /var/www/s2survey/html/modules
sudo chown -R www-ftp:www-data /var/www/s2survey/html/plugins
sudo chown -R www-ftp:www-data /var/www/s2survey/html/script
sudo chown -R www-ftp:www-data /var/www/s2survey/html/templates

# Jetzt noch die Zugriffsrechte
sudo chmod -R u-x+rwX,g-xw+rX,o-rwx /var/www/s2survey/html
sudo chmod 770 /var/www/s2survey/html
sudo chmod -R u-x+rwX,go-rwx /var/www/s2survey/html/files/protected
sudo chmod -R u-x+rwX,go-rwx /var/www/s2survey/html/system/keyring
sudo chmod -R u-x+rwX,go-rwx /var/www/s2survey/html/shop/system/keyring

sudo chown -R www-data:root /var/www/s2survey/log
</code>

<code bash>
sudo mysqldump -umaster -p --databases s2survey --quick --single-transaction | gzip -9 > /home/transfer/transfer-s2survey.sql.gz
</code>

Auf dem anderen Server die Daten holen und einspielen.

<code bash>
scp -i ~/.ssh/id_rsa transfer@95.130.22.100:/home/transfer/transfer* /home/transfer
gunzip -c /home/transfer/transfer-s2survey.sql.gz | mysql -u master -p s2survey
</code>

  * RTR-Mobile testen
  * Owncloud testen
  * Shop + Lizenzaktivierung testen


==== Let's Encrypt ====

Eventuell muss die Konfiguration den ''letsencrypt'' kopiert werden. Dafür muss auf dem einen Server erstmal das Verzeichnis auf den Nutzer ''sosci'' übereignet werden:

<code bash>
sudo chown -R transfer:root /etc/letsencrypt/
</code>

Dann muss auf dem anderen Server mit Symlinks kopiert werden:

<code bash>
sudo rsync -avz -e ssh transfer@95.130.22.100:/etc/letsencrypt/accounts transfer@95.130.22.100:/etc/letsencrypt/archive transfer@95.130.22.100:/etc/letsencrypt/live transfer@95.130.22.100:/etc/letsencrypt/keys /etc/letsencrypt
</code>

Und dann die Dateieigentümer wiederhergestellt auf dem einen Server

<code bash>
sudo chown -R root:root /etc/letsencrypt/
</code>

Zum Testen dann...

<code bash>
sudo /usr/bin/certbot renew --dry-run --post-hook "service nginx reload"
</code>


===== IP-Adresse ändern =====


==== Ubuntu ====

Zum Ändern der IP-Adresse s. [[https://wiki.ubuntuusers.de/Netplan/|netplan]] und [[https://www.linux.com/learn/intro-to-linux/2018/9/how-use-netplan-network-configuration-tool-linux|linux.com]].

Es kann sinnvoll sein, erstmal eine IP-Adresse umzustellen und dann die andere.

Unter Debian ''/etc/network/interfaces'' (kein ''netplan'').

<code bash>
sudo vim /etc/network/interfaces

sudo ifup --no-act ens18:0
sudo systemctl restart networking
</code>

Unter Ubuntu gibt es ''netplan''.

<file conf /etc/netplan/01-netcfg.yaml>
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
          ens160:
                  dhcp4: no
                  dhcp6: no
                  addresses: [95.130.22.100/28,95.130.22.101/28]
                  gateway4: 95.130.22.97
                  nameservers:
                          addresses: [95.130.16.100,95.130.16.121]
</file>

Die Konfiguration kann dann wie folgt testweise geladen werden:

<code>
sudo netplan try
</code>

Danach muss man noch dafür sorgen, dass die Router und Switches den ARP-Cache aktualisieren. Dafür braucht man den Namen der Schnittstelle (hier/oben ist das ens160) und...

<code bash>
sudo apt install iputils-arping

arping -U -I ens160 95.130.22.98
</code>


==== Debian ====

Unter Debian ist der Standard weiterhin ''ifupdown'' mit der Konfiguration unter ''/etc/network/interfaces''. Dort kann man auch mehrere IP-Adressen parallel aktivieren.

<code>
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
# This is an autoconfigured IPv6 interface

allow-hotplug ens192
auto ens192:1
auto ens192:2

iface ens192 inet static
    address 95.130.22.100/28
    gateway 95.130.22.97

iface ens192 inet6 static
    address 2a02:2940:0:c007:95:130:22:100/64
    gateway 2a02:2940:0:c007::1

iface ens192:1 inet static
    address 95.130.22.101/28

iface ens192:1 inet6 static
    address 2a02:2940:0:c007:95:130:22:101/64
</code>

Zum Testen

<code>
sudo ifup --no-act ens192:1
</code>

Eine einzelne IP-Adresse kann man dann ohne Neustart oder ''reload'' direkt aktivieren:

<code bash>
ifup ens192:1
</code>

==== Ablauf ====

  - Eine IP-Adresse (IPv4 oder IPv6) festlegen, über welcher der alte Server vorerst erreichbar bleibt -> notieren
  - Eine IP-Adresse (IPv4 oder IPv6) festlegen, über welcher der neue Server vorerst erreichbar bleibt -> notieren
  - Über diese Adressen auf dem beiden Servern einloggen und ''sudo su'' + ''# OLD'' bzw ''# NEW'' ins Fenster
  - Primäre IP-Adresse auf dem alten Server deaktivieren (''netplan'' oder ''ifdown'')
  - Primäre IP-Adresse auf dem neuen Server aktivieren
  - Aufruf über den Server testen + Aktualität der Logfiles ''ls -la /var/www/s2survey/log/n-access*''


===== Letzte Änderungen =====

  * Crontabs (root/www-data) auf demalten Server deaktivieren und auf dem neuen aktivieren
  * Neues ''mariadb'' Passwort eintragen in ''/var/www/s2survey/html/system/config.php'' -> ''DbConnection::initConnection()''
  * Cache in SoSci Survey leeren (just in case)
  * Aufgeschaltete Domains prüfen
  * Update der SSL-Zertifikate via Let's Encrypt testen (''--dry-run'')
  * Mailversand testen
  * Rückläufer testen
  * Logrotation für ''nginx'' Zugriffs-Logs
  * Firewall prüfen (IPv4 und IPv6, z.B. [[https://www.ipvoid.com/port-scan/]])
  * Backup laufen lassen (daily) und prüfen
  * User ''transfer'' löschen (beide Server)

<code bash>
sudo certbot renew --dry-run
sudo certbot renew --force-renewal
</code>